/**
 * Author: lonewolf
 * Date: 2014-10-05 11:40:18
 */
/**
 * 计时器，有两个事件：
 * LTimerEvent.TIMER 每过一个时间间隔都会触发
 * LTimerEvent.TIMER_COMPLETE 重复次数完成后触发
 *
 * @param {int} delay 计时器时间间隔，毫秒为单位
 * @param {int} repeatCount 可选参数，计时器运行总次数，0表示无穷尽，默认为0。
 */
function LTimer (delay,repeatCount) {
	LExtends(this, LEventDispatcher, []);
	this.intervalId=null;
	this.running=false;
	this.setDelay(delay);
	if (arguments[1]) {
		this.setRepeatCount(repeatCount);
	}
	else
	{
		this.repeatCount=0;
	}
	this.currentCount=0;
}
/**
 * 启动计时器
 * 如果计时器尚未运行，则启动计时器
 */
LTimer.prototype.start = function() {
	if (this.running) {
		return;
	};
	if (this.repeatCount>0&&this.currentCount>=this.repeatCount) {
		// 已经到头了
		this.currentCount=this.repeatCount;
		return;
	}
	this.running=true;
	this.intervalId=setInterval(LTimer_myInterval(this),this.delay);
};
/**
 * 停止计时器
 */
LTimer.prototype.stop = function() {
	if (this.intervalId) {
		clearInterval(this.intervalId);
		this.intervalId=null;
	};
	this.running=false;
};
/**
 * 重置计时器
 * 如果计时器正在运行，则停止计时器，并将 currentCount 属性设回为 0，这类似于秒表的重置按钮
 */
LTimer.prototype.reset = function() {
	this.stop();
	this.currentCount=0;
};
// 包装后的setInterval执行函数，以便携带参数timer
function LTimer_myInterval (timer) {
	return function () {
		LTimer_onInterval(timer);
	}
}
function LTimer_onInterval (timer) {
	timer.currentCount++;
	if (timer.repeatCount>0&&timer.currentCount>=timer.repeatCount) {
		// 完成
		timer.currentCount=timer.repeatCount;
		clearInterval(timer.intervalId);
		timer.intervalId=null;
		timer.running=false;
		timer.dispatchEvent(LTimerEvent.TIMER);
		timer.dispatchEvent(LTimerEvent.TIMER_COMPLETE);
	}
	else
	{
		timer.dispatchEvent(LTimerEvent.TIMER);
	}
}

/**
 * 计时器从 0 开始后触发的总次数
 */
LTimer.prototype.getCurrentCount = function() {
	return this.currentCount;
};

/**
 * 设置计时器事件间的延迟（tick时间间隔）
 * 如果在计时器正在运行时设置延迟间隔，则计时器将按相同的 repeatCount 迭代重新启动 
 *
 * @param {int} delay
 */
LTimer.prototype.setDelay = function(delay) {
	delay=parseInt(delay+"");
	if (isNaN(delay)||delay<=0) {
		delay=1;
	};
	this.delay=delay;
	// 如果是运行中，则重新启动
	if (this.running) {
		this.stop();
		this.start();
	};
};
/**
 * 获取计时器事件间的延迟（tick时间间隔）
 */
LTimer.prototype.getDelay = function() {
	return this.delay;
};
/**
 * 设置计时器运行总次数
 * 如果设置为 0，则计时器将持续不断运行，直至调用了 stop() 方法或程序停止。 
 * 如果不为 0，则将运行计时器，运行次数为指定的次数。 
 * 如果设置的 repeatCount 总数等于或小于 currentCount，则计时器将停止并且不会再次触发。
 *
 * @param {int} repeatCount
 */
LTimer.prototype.setRepeatCount = function(repeatCount) {
	repeatCount=parseInt(repeatCount+"");
	if (isNaN(repeatCount)||repeatCount<0) {
		repeatCount=0;
	};
	this.repeatCount=repeatCount;
};
/**
 * 获取计时器运行总次数
 */
LTimer.prototype.getRepeatCount = function() {
	return this.repeatCount;
};
/**
 * 计时器是否在运行
 */
LTimer.prototype.isRunning = function() {
	return this.running;
};

// 以下是LTimerEvent事件
var LTimerEvent = function (){throw "LTimerEvent cannot be instantiated";};
LTimerEvent.TIMER = "timer";
LTimerEvent.TIMER_COMPLETE = "timer_complete";